/*
 * @Description: 全宗上下文
 * @Author: Rfan
 * @Date: 2022-03-31 13:22:48
 * @LastEditTime: 2022-04-26 16:50:41
 */

import { createContext, useContext, useEffect, useReducer } from 'react';
import {
  createRole,
  deleteRole,
  deleteRoleUser,
  fetchRoleList,
  fetchRoleUserList
} from '@/api/role';
import { appState } from '@/store/mobx';
import {
  CHANGE_ACTIVE_TAB,
  CLEAR_SELECT_USER,
  DELETE_ROLE,
  DELETE_ROLE_USER,
  HIDE_ADD_DIALOG,
  INCERT_ROLE,
  SET_ROLE_LIST,
  SET_ROLE_USER_LIST,
  SET_SELECT_ROLE_ID,
  SET_SELECT_UNIT_ID,
  SET_SELECT_USER_ID,
  SHOW_ADD_DIALOG
} from '../constants';
import { RoleReducer } from '../reducers/RoleReducer';

const initialState = {
  // 当前选中的项目
  selectUnitId: '',
  // 当前选中的项目
  selectRoleId: '',
  // 当前选中的tab页
  selectTab: '1',
  // 用户列表选中的用户ID
  selectUserIds: [],

  // 角色列表
  roleList: [],

  // 创建角色弹窗列表
  addRoleDialog: {
    visible: false
  },

  // ------ 角色用户列表面板相关 ------
  userList: [],

  // -------- 字典 --------
  // 角色类型
  roleTypeList: [
    { id: 0, name: '普通用户', desc: '' },
    { id: 1, name: '全宗角色', desc: '可管理，利用本全宗的所有档案' },
    { id: 2, name: '部门角色', desc: '可管理本部门的档案' },
    { id: 3, name: '个人角色', desc: '可管理个人采集的档案数据' }
  ],

  // 用户类型（职务头衔） - 只展示
  userTypeList: [
    { id: 0, name: '普通用户' },
    { id: 1, name: '部门资料员' },
    { id: 2, name: '部门领导' },
    { id: 3, name: '档案员' },
    { id: 4, name: '单位领导' }
  ],

  // 账号状态
  accountStateList: [
    { id: 0, name: '有效' },
    { id: 1, name: '无效' }
  ]
};

const RoleContext = createContext();

const RoleContextProvider = (props) => {
  const [state, dispatch] = useReducer(RoleReducer, initialState);

  const actions = {
    /**
     * @description: 设置选中的部门
     * @param {string} 选中单位的ID
     */
    setSelectUnitId(id) {
      dispatch({ type: SET_SELECT_UNIT_ID, id });
    },

    /**
     * @description: 设置选中的角色
     * @param {string} id 选中角色的ID
     */
    setSelectRoleId(id) {
      dispatch({ type: SET_SELECT_ROLE_ID, id });
      dispatch({ type: CLEAR_SELECT_USER });
    },

    /**
     * @description: 获角色列表
     * @param {string|number} unitId 选中单位的ID
     */
    getRoleList(unitId) {
      fetchRoleList({ unitId }).then((res) => {
        const { data } = res;
        dispatch({ type: SET_ROLE_LIST, data });
        dispatch({
          type: SET_SELECT_ROLE_ID,
          id: data[0]?.id ? `${data[0]?.id}` : data[0]?.id
        });
      });
    },

    /**
     * @description: 打开创建角色弹窗
     */
    showAddDialog() {
      dispatch({ type: SHOW_ADD_DIALOG });
    },

    /**
     * @description: 关闭创建角色弹窗
     */
    hideAddDialog() {
      dispatch({ type: HIDE_ADD_DIALOG });
    },

    /**
     * @description: 切换tab
     */
    changeActiveTab(id) {
      dispatch({ type: CHANGE_ACTIVE_TAB, id });
    },

    /**
     * @description: 添加角色方法
     * @param {*} data 角色名称，角色类型
     */
    addRoleFunc(data) {
      data.unitId = appState.unitId;
      createRole(data).then((res) => {
        const { data } = res;
        dispatch({ type: INCERT_ROLE, data });
        dispatch({ type: SET_SELECT_ROLE_ID, id: `${data?.id}` });
      });
    },

    /**
     * @description: 删除角色方法
     * @param {number|number[]} id
     */
    deleteRoleFunc(id) {
      deleteRole(id).then((res) => {
        const data = res.data.map((id) => parseInt(id, 10));
        dispatch({ type: DELETE_ROLE, ids: data });
      });
    },

    // ---------------------- 角色用户列表 ------------------------------------------
    /**
     * @description: 删除角色方法
     * @param {number|number[]} id
     */
    getRoleUserList(query) {
      return new Promise((resolve, reject) => {
        fetchRoleUserList(query)
          .then((res) => {
            const { data } = res;
            dispatch({ type: SET_ROLE_USER_LIST, data: data.results });
            resolve(data);
          })
          .catch((err) => {
            reject(err);
          });
      });
    },

    changeSelectUserId(way, id) {
      dispatch({ type: SET_SELECT_USER_ID, way, id });
    },

    /**
     * @description: 删除角色方法
     * @param {number|number[]} id
     */
    deleteRoleUserFunc(id) {
      const ids = id instanceof Array ? id.join(',') : id;
      deleteRoleUser(ids).then((res) => {
        const data = res.data.map((id) => parseInt(id, 10));
        dispatch({ type: DELETE_ROLE_USER, ids: data, srtIds: res.data });
      });
    }
  };

  const filters = {
    // 返回只包含管理角色的列表
    adminRoleTypeList: state.roleTypeList.filter((item) => item.id > 0),

    /**
     * @description: 根据id获取角色信息
     * @param {*} id 角色ID
     * @return {*} 角色信息
     */
    getRoleInfo(id) {
      return state.roleList.find((role) => role.id === parseInt(id, 10));
    },

    /**
     * @description: 根据id获取用户类型（职务头衔）
     * @param {*} id 用户类型ID
     * @return {*} 用户类型
     */
    userTypeFilter(id) {
      return state.userTypeList.find((item) => item.id === id)?.name || '-';
    },

    /**
     * @description: 根据id获取用户状态
     * @param {*} id 用户状态ID
     * @return {*} 用户状态
     */
    userStateFilter(id) {
      return state.accountStateList.find((item) => item.id === id)?.name || '-';
    }
  };

  // watch
  useEffect(() => {}, []);

  return (
    <RoleContext.Provider value={{ ...state, ...actions, ...filters }}>
      {props.children}
    </RoleContext.Provider>
  );
};

export const useRoleContext = () => {
  return useContext(RoleContext);
};

export { RoleContext, RoleContextProvider };
